﻿#ifndef ACQURE_H
#define ACQURE_H

#include <QObject>
#include <QMetaType>
#include <iostream>
#include "opencv2/opencv.hpp"
#include "opencv2/core.hpp"
using namespace std;
extern "C"{
    #include "USB5630.h"
}
Q_DECLARE_METATYPE(cv::Mat)
class Acqure : public QObject
{
    Q_OBJECT
public:
    explicit Acqure(QObject *parent = nullptr, HANDLE dev_handle = INVALID_HANDLE_VALUE);
    ~Acqure();
    void select_RefGround(int index);
    void select_SampleRange(int index);
    void change_SampleRate(double value);
    void change_SampChanCount(int count);
    void change_SampsPerChan(int count);
public slots:
    bool DEV_Init();// 创建设备后进行设备初始化
    bool Port_Config();
    bool AI_VerifyParam();
    bool AI_InitTask();// 第二步 初始化AI采样任务
    bool AI_StartTask();// 第三步 启动AI采样任务
    bool AI_SendSoftTrig();// 第四步 发送软件触发事件(硬件外触发时不需要)
    bool AI_ReadBinary();// 第五步 循环读取AI数据
    void loop_read();//循环读取
    void stop_loop_read();
    bool AI_StopTask();// 第六步 停止AI采样
    bool AI_ReleaseTask();// 第七步 释放AI采集任务
    bool DEV_Release();// 第八步 释放设备对象
signals:
    void out_log(const QString& msg);
    void out_mat(const cv::Mat& mat);
private:
    USB5630_AI_PARAM AIParam;//AI工作参数结构体
    U32 nReadSampsPerChan = 0;//每通道请求读入的数据点数
    U32 nSampsPerChanRead = 0;//每通道实际读取到的点数
    F64 fTimeout = 10.0; // 10秒钟超时
    U32 nReadableSamps = 0;//本次操作结束时，可读取但尚未读取的点数
    HANDLE hDevice = INVALID_HANDLE_VALUE;//设备操作句柄
    USB5630_PORT_PARAM	PortParam;//端口配置，端口功能、方向、值等参数
    U16 nBinArray[64];  //AI读取结果
    cv::Mat signal_mat;
    bool isReading = false;

    int dataRows = 64;
    int dataColumns = 64;
    int RefGround = USB5630_AI_REFGND_RSE;
    int SampleRange = USB5630_AI_SAMPRANGE_N10_P10V;
    double SampleRate = 7812.5;
};

#endif // ACQURE_H
